//
//  lsudoku.m
//  lsudoku
//
//  Created by richard_local on 22/08/13.
//  Copyright (c) 2013 ierdre.com. All rights reserved.
//

#import "lsudoku.h"
#include <stdio.h>
#include "DDFileReader.h"
#define LINE(x) (x/9)
#define COL(x) (x%9) 
//Liste des cases des 9 blocs dans l'ordre des blocs    

//#define BLOC(x) x>27? (x>53 ?0:((((x-54)%9)/3)+3) ) :((x%9)/3)
#define BLOC(x) (x<27)? \
((x%9)/3) \
:(x<54 ? ((((x-27)%9)/3)+3): ((((x-54)%9)/3)+6)  )

@implementation lsudoku
//Met à jour la grille suite à la creation ou à la modification d'une case
-(void) grilleUpdate{
    
    int TABBLOC[] ={
        0,1,2,9,10,11,18,19,20,
        3,4,5,12,13,14,21,22,23,
        6,7,8,15,16,17,24,25,26,
        27,28,29,36,37,38,45,46,47,
        30,31,32,39,40,41,48,49,50,
        33,34,35,42,43,44,51,52,53,
        54,55,56,63,64,65,72,73,74,
        57,58,59,66,67,68,75,76,77,
        60,61,62,69,70,71,78,79,80
    };
    /* pour cahque case il faut calculer
    si pas indices 
     ligne déja occupé 
     colonne déja occupé 
     bloc déja occupé
    */
    
   
  
    //parcours des cases et si no indice mise à jour des possibles
    for (int i=0; i <81 ; i ++){
        
        if (!grille.cases[i].isIndice) {
            //reinit à 0
            for (int j=0; j < 9; j++){
                grille.cases[i].champs.tab[j]=1;
            }
        
            for (int j=0; j < 9; j++){
            //    grille.cases[i].champs.tab[j]=1;
                //on demande si l'indice est présent dans la ligne sauf dans notre case
               

                
                // pour les lignes
                for (int l=LINE(i)*9;l< (LINE(i)*9) + 9; l++) {
                   // NSLog(@"%d" ,grille.cases[l].value);
                    if(l!=i) {
                        // on compare pas une case avec la valeur d'elle même
                        if (grille.cases[l].value >0) { // la cas contient une valeur
                            //on supprime la valeur des possibles
                            grille.cases[i].champs.tab[grille.cases[l].value-1]=0;
                        }
                      
                    }
                }
                //Pour les colonnes
                for (int l=COL(i);l< 82-((9-COL(i))); l=l+9) {
                    // NSLog(@"%d" ,grille.cases[l].value);
                    if(l!=i) {
                        // on compare pas une case avec la valeur d'elle même
                        if (grille.cases[l].value >0) { // la cas contient une valeur
                            //on supprime la valeur des possibles
                            grille.cases[i].champs.tab[grille.cases[l].value-1]=0;
                        }
                        
                    }
                }
                for (int k=0;k< 9; k++) {
                    // NSLog(@"%d" ,grille.cases[l].value);
                    int l=TABBLOC[(BLOC(i)*9)+k];
                   // NSLog(@"%d %d %d" ,l,BLOC(i),grille.cases[l].value );
                    if(l!=i) {
                        // on compare pas une case avec la valeur d'elle même
                        if (grille.cases[l].value >0) { // la cas contient une valeur
                            //on supprime la valeur des possibles
                            grille.cases[i].champs.tab[grille.cases[l].value-1]=0;
                        }
                        
                    }
                }
    
            
            }//fin parcours des cases
        
        
    
        
        
        }// sous selection des cases not indices
        
        
    }



}
-(void) loadFromFile:(NSString*) nameFile num:(int) numero{
 //   NSString *fileName= [[NSBundle mainBundle] pathForResource:@"data-1" ofType:@"txt"];
   // NSString* path = [[NSBundle mainBundle] pathForResource:@"data-1"
  

    DDFileReader * reader = [[DDFileReader alloc] initWithFilePath: nameFile];
    NSString * line = nil;
   // NSLog(@"read line: %@ ",reader);
    for (int i=0; i<numero;i++) {
        line = [reader readLine];
        
    }
  //  NSMutableString *newString = [NSMutableString string];
    int i=0;
    //Alimentation de la grille avec les numéro choisis

    for (i = 0; i < [line length]; i++)
    {
      int ascii = [line characterAtIndex:i];
              
           
//            [newString appendFormat:@"%c",ascii];
        
            int value =  [[NSString stringWithFormat:@"%c",ascii] intValue];
            grille.cases[i].value = value;
        if (value  > 0 ) {
            grille.cases[i].isIndice = true;
            for (int j=0; j < 9; j++){
                grille.cases[i].champs.tab[j]=0;
            }
        }
        
        
        
    }
    // i doit etre égale à 80 sinon erreur TO DO : a tester
    // calcul pour chaque case de la liste des valeurs possible à mettre
    [self grilleUpdate];
    
}

-(id) init{
    if ( self = [super init] ) {
        for (int i=0; i <81 ; i ++){
            grille.cases[i].value = -1;
             grille.cases[i].isIndice = false;
            
            for (int j=0; j < 9; j++){
                grille.cases[i].champs.tab[j]=1;
            }

           }
    }
    return self;
}

-(NSString *) description {
   NSMutableString* result = [NSMutableString string];
    [result appendFormat:@"********************* \n\n TEST \n"];
    //parcours les cases de la grille
    int k =-1;
    [result appendFormat:@"---------------------"];
    for (int i=0; i <81 ; i ++){
        if ((((i) %3)  ==0) && (i>0)){
            [result appendFormat:@"|"];
        }
     
        if (((i) %9)  ==0){
            [result appendFormat:@"\n"];
            k++;
        }
        if ((((k) %3)  ==0) && (k>0)){
             [result appendFormat:@"---------------------\n"];
            k=0;
         }
        if (grille.cases[i].value > 0 ) {
            [result appendFormat:@"%d ",grille.cases[i].value];
        }
        else {
            [result appendFormat:@"  "];
        }
    }
    [result appendFormat:@"|"];
    [result appendFormat:@"\n---------------------\n"];
    [result appendFormat:@"\n*************************\n détails des cases : \n"];
    for (int i=0; i <81 ; i ++){
        [result appendFormat:@"%d [%d] [%d] - Bloc - %d -INDICE %d ",i,LINE(i),COL(i),BLOC(i),grille.cases[i].isIndice];
        for (int kb=0; kb <9; kb++) {
            Byte bn = grille.cases[i].champs.tab[kb];
            if (bn) {
                [result appendFormat:@"X"];
            }
            else {
                [result appendFormat:@"-"];
            }
        }
        [result appendFormat:@"\n"];
    }
    
    return result;
    
}
@end
